Даны три
стержня. На первом стержне находится несколько дисков сверху вниз по
возрастанию размера диска. Два другие пустые. Требуется перенести все диски с
первого стержня на второй. Переносить диски разрешается только по одному. Не разрешается
класть больший диск на меньший.
Вход. Количество
дисков n (1 ≤ n ≤ 19)
на первом стержне.
Выход. Выведите
по два числа в строке – номера стержней, откуда и куда переносится диск.
Решение должно быть кратчайшим.
Пример входа |
Пример выхода |
3 |
1 2 1 3 2 3 1 2 3 1 3 2 1 2 |
рекурсия
Пусть требуется
перенести n дисков со стержня А на стержень B при помощи стержня C.
Воспользуемся
следующей рекурсивной схемой:
·
перенесем n – 1 дисков со стержня
А на стержень C, используя B;
·
перенесем диск со стержня А на стержень
B;
·
перенесем n – 1 дисков со стержня
C на стержень B, используя А;
Функция hanoi моделирует перенос дисков со стержня from на стержень to, используя дополнительный стержень additional.
void
hanoi(int n, int
from, int to, int
additional)
{
if (n == 0) return;
hanoi(n-1,from,additional,to);
printf("%d
%d\n",from,to);
hanoi(n-1,additional,to,from);
}
Читаем
количество дисков n. Моделируем работу ханойских башен по переносу n
дисков с первого стержня на второй,
используя третий.
scanf("%d",&n);
hanoi(n,1,2,3);
Java реализация
import java.util.*;
public class Main
{
static void hanoi(int n, int from, int to, int additional)
{
if (n == 0) return;
hanoi(n-1,from,additional,to);
System.out.println(from + " " + to);
hanoi(n-1,additional,to,from);
}
public static void main(String[] args)
{
Scanner con = new Scanner(System.in);
int n = con.nextInt();
hanoi(n,1,2,3);
con.close();
}
}
Python реализация
def hanoi(n, fro, to,
additional) :
if (n == 0) : return
hanoi(n-1,fro,additional,to)
print(fro,to)
hanoi(n-1,additional,to,fro)
n = int(input())
hanoi(n,1,2,3)